51单片机的汇编语言程序设计

8051汇编指令集

死循环

SJMP $

程序会不断重复执行这条指令直到被外部中断或复位。要跳出这个无限循环:
外部中断:如果微控制器配置了外部中断,并且满足中断条件,中断服务程序可以被调用,从而跳出循环。

SJMP $ 这条指令中的 $ 符号是一个汇编语言中的立即数,代表当前指令的地址。
所以,SJMP $ 实际上是一个无限循环的指令,因为它告诉程序跳回到当前指令的位置并重新执行它。这通常用于等待某个事件的发生,或者在某些情况下,作为程序的暂停或死循环。
如果程序执行到 SJMP $ 这条指令,它将不断重复执行这条指令,直到程序被外部事件打断或停止。

简单延时

所有的二极管闪动:

ORG 0000H
START: MOV P1,#00H
	ACALL DELAY 
	MOV P1,#0FFH 
	ACALL DELAY 
	AJMP STAET 
DELAY: MOV R3,#7FH
DEL2:  MOV R4,#0FFH  
DEL1:  NOP
	DJNZ R4,DEL1
	DJNZ R3,DEL2
	RET 
END
DELAY: MOV R3,#(X)H   ;内循环次数X
DEL2:  MOV R4,#(Y)H   ;外循环次数Y
DEL1:  NOP    ;1T
	   NOP    ;1T
       DJNZ R4,DEL1  ;2T
       DJNZ R3,DEL2  ;2T (忽略)
       RET 

T 为一个机器周期,也即 12 个时钟周期
如果晶振频率为 fosc=112×106T=1us 微秒
近似的延时时间:
(1+1+2)×X×Y

DELAY: MOV R2,#10H   
DEL2:  MOV R3,#200H   
DEL2:  MOV R4,#125H   
DEL1:  NOP    ;1T
	   NOP    ;1T
       DJNZ R4,DEL1  ;2T
       DJNZ R3,DEL2  ;2T (忽略)
       DJNZ R2,DEL2  ;2T (忽略)
       RET 

4T×10×200×125=1s

子程序

堆栈保证:子程序调用、返回到主程序中的正确位置,并接着执行主程序中的后续指令

比较两个数的大小

SUBB A,@R1  ;带借位的减法, 
JNC NEXT    ; 无借位时 CY=0 跳转,也即A>=@R1 时跳转 
MOV A,@R1 ; 顺序执行到此时,也即 将更大的值赋给A